<?php

namespace App\Org\Developer;

use Illuminate\Http\Request;

/**
 * @author 陈玉琦
 * 文件处理助手
 */

class FileHandler
{
	/**
	 * nodejs 向 php 接口发送的是文件的内容
	 * 可能是 base64 加密的
	 * 也可能是二进制流（需要额外的参数指明文件类型，这样才能存储文件）
	 */

	public static function saveNodeFile($data = '', $savePath = '', $type = 'base64')
	{
		if ($type == 'base64') {
			return self::base64File($data, $savePath);
		}
		return false;
	}

	/**
	 * base64 内容的文件处理
	 */
	private static function base64File($base64String = '', $savePath = '', Request $request)
	{
		// 截取一部分进行操作
		$str = substr($base64String, 0, 50);

		// 逗号的位置
		$commaPosition = strpos($str, ',');
		$commaPosition++;

		// 图片本身内容
		$imageString = substr($base64String, $commaPosition);//, strlen($base64String) - $commaPosition

		// 图片类型
		$mime = substr($str, 5, (strpos($str, ';') - 5));
		$imageType = substr($mime, 6);

		// 文件名称
		$fileName = dateName();

		// web 访问目录结构
		$webUrl = self::webPathHandler($savePath) . md5($request->session()->get('user_id')) . '/' . DateHelper::dateName();
		$directory = $request->server('document_root') . $webUrl;
		if (self::directoryExists($directory)) {
			file_put_contents($directory . '/' . $fileName . '.' . $imageType, base64_decode($imageString));
			return $webUrl . '/' . $fileName . '.' . $imageType;
		}

		return false;
	}

	/**
	 * 二进制流 内容的文件处理
	 * 这种方式需要额外参数来指明该文件的类型
	 */
	private static function octetStreamFile($base64String = '', $savePath = '')
	{
		// ...
	}

	/**
	 * 参数 $savePath 是否有两侧的 /
	 * 返回的是这样的：/xx/xx/xx/
	 */
	private static function webPathHandler($savePath = '')
	{
		return DIRECTORY_SEPARATOR . trim($savePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
	}

	/**
	 * 目录创建
	 */
	private static function directoryExists($directory = '')
	{
		if (!file_exists($directory)) {
			return mkdir($directory, 0777, true);
		}
		return true;
	}
}